#define _CRT_SECURE_NO_WARNINGS 1
//
//#include<stdio.h>
//void sort(int* arr,int sz)
//{
//	int i = 0;
//	for (i = 0; i < (sz - 1) - 1; i++)
//	{
//		int j = 0;
//		//int flag = 1;//flag=1表示已经排好序
//		for (j = 0; j < (sz - 1) - i; j++)
//		{
//			if (arr[j] > arr[j + 1])
//			{
//				//flag = 0;
//				int tmp = 0;
//				tmp = arr[j];
//				arr[j] = arr[j + 1];
//				arr[j + 1] = tmp;
//			}
//			
//		}
//		//if (flag)  //避免无意义的计算，效率更高，例如已经排好序的数组可以避免多次无意义的比较
//			//break;
//	}
//}
// 
//void print(int* arr, int sz)
//{
//	int i = 0;
//	for (i = 0; i < sz; i++)
//	{
//		printf("%d ", *(arr + i));
//	}
//}
//int main()
//{
//	int arr[10] = { 0 };
//	int i = 0;
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	for (i = 0; i < 10; i++)
//	{
//		scanf("%d", &arr[i]);
//	}
//	sort(arr,sz);//冒泡排序
//	print(arr, sz);
//	return 0;
//}
//
//
//
//
//
//
//
////求出0～100000之间的所有“水仙花数”并输出。
////“水仙花数”是指一个n位数，其各位数字的n次方之和确好等于该数本身，
// //如:153＝1 ^ 3＋5 ^ 3＋3 ^ 3，则153是一个“水仙花数”。
//
//
//#include<stdio.h>
//#include<math.h>
//void narcissisticnumber()
//{
//	int i = 0;
//	for (i = 0; i < 100000; i++)
//	{
//		int n = 0;//位数
//		int tmp = i;
//		while (tmp != 0)
//		{
//			n++;
//			tmp /= 10;
//		}
//		tmp = i;
//		int sum = 0;
//		while (tmp != 0)
//		{
//			sum+=pow(tmp % 10,n);//pow(x,n)表示x^n，x的n次方，头文件为math.h
//			tmp /= 10;
//		}
//		if (sum == i)
//			printf("%d ", i);
//	}
//}
//int main()
//{
//	narcissisticnumber();
//	return 0;
//}
//
//
//
//
//
//
//
//
//
//
////求sn = a + aa + aaa + aaaa + aaaaa的前5项之和，其中a是一个数字，
////例如：2 + 22 + 222 + 2222 + 22222
//#include<stdio.h>
//int main()
//{
//	int a = 0;
//	scanf("%d", &a);
//	int arr[5] = { 0 };
//	int i = 0;
//	int sum = 0;
//	for (i = 1; i < 5; i++)
//	{
//		arr[0] = a;
//		arr[i] = arr[i - 1] * 10 + a;
//	}
//	for (i = 0; i < 5; i++)
//	{
//		sum = sum + arr[i];
//	}
//	printf("%d\n", sum);
//	return 0;
//}
// 
// 
// 
//#include<stdio.h>
//int suma(int a, int n)
//{
//	int tmp = 0;
//	int sum = 0;
//	for (int i = 0; i < n; i++)
//	{
//		tmp = tmp * 10 + a;
//		sum += tmp;
//	}
//	return sum;
//}
//int main()
//{
//	int a = 0;
//	int n = 0;//前n项和
//	scanf("%d%d", &a, &n);
//	printf("sum = %d\n", suma(a, n));
//	return 0;
//}
//
//
//
//
//
//
////喝汽水，1瓶汽水1元，2个空瓶可以换一瓶汽水，给20元，可以喝多少汽水（编程实现）。
//#include<stdio.h>
//int func(int money)
//{
//	int total = money;
//	int empty = money;
//	while (empty > 1)
//	{
//		total = total + empty / 2;
//		empty = empty / 2 + empty % 2;
//	}
//	return total;
//}
//int main()
//{
//	int money = 0;
//	scanf("%d", &money);
//	printf("%d\n", func(money));
//	return 0;
//}
//
//
//
//
//
////打印菱形图案
//void printshape(int row)
//{
//	//先打印上半部分
//	int i = 0;
//	for (i = 0; i < row; i++)
//	{
//		int j = 0;
//		for (j = 0; j < row - 1 - i; j++)
//		{
//			printf(" ");
//		}
//		for (j = 0; j < 2 * i + 1; j++)
//		{
//			printf("*");
//		}
//		printf("\n");
//	}
//
//	//后打印下半部分
//	for (i = 0; i < row - 1; i++)
//	{
//		int j = 0;
//		for (j = 0; j < i + 1; j++)
//		{
//			printf(" ");
//		}
//		for (j = 0; j < 2 * (row - 1) - 1 - 2 * i; j++)
//		{
//			printf("*");
//		}
//		printf("\n");
//	}
//
//}
//
//
//#include<stdio.h>
//int main()
//{
//	int row = 7;
//	printshape(row);
//	return 0;
//}
//
//
////用递归实现n的k次方
//#include<stdio.h>
//int func(int n, int k)
//{
//	//if (k == 1)
//		//return n;
//	if (k == 0)
//		return 1;
//	if (k != 0)
//		return n * func(n, k - 1);
//}
//int main()
//{
//	int n = 0;
//	int k = 0;
//	scanf("%d %d", &n, &k);
//	printf("%d\n", func(n, k));
//	return 0;
//}
//
//
////用递归实现一个整数的每位之和
//#include<stdio.h>
//int func(int n)
//{
//	if (n < 10)
//		return n;
//	if (n > 9)
//		return n % 10 + func(n / 10);
//}
//int main()
//{
//	int n = 0;
//	scanf("%d", &n);
//	printf("%d\n", func(n));
//	return 0;
//}
//
////利用递归实现n的阶乘
//#include<stdio.h>
//int fac(int n)
//{
//	if (n == 1)
//		return 1;
//	return n * fac(n - 1);
//}
//int main()
//{
//	int n = 0;
//	scanf("%d", &n);
//	printf("%d\n", fac(n));
//	return 0;
//}
//
////打印一个数的每一位
//#include<stdio.h>
//void print(int n)
//{
//	if (n < 10)
//		printf("%d ", n);
//	else
//	{
//		print(n / 10);
//		printf("%d ", n % 10);
//	}
//
//}
//int main()
//{
//	int n = 0;
//	scanf("%d", &n);
//	print(n);
//	return 0;
//}
//
//
////单身狗：找出只出现一次的数字
//#include<stdio.h>
//int func(int* arr, int sz)
//{
//	int i = 0;
//	int ret = 0;
//	for (i = 0; i < sz; i++)
//	{
//		ret ^= arr[i];   //n^n=0,0^n=n,     1^2^3^4^5^4^3^2^1 = 1^1^2^2^3^3^4^4^5
//		                                                      // 0 ^ 0 ^ 0 ^ 0 ^5 = 0^5 = 5
//	}
//	return ret;
//}
//int main()
//{
//	int arr[] = { 1,2,3,4,5,4,3,2,1 };
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	printf("%d\n", func(arr, sz));
//	return 0;
//}
//
//
//
//
//
////打印整数二进制的奇数位和偶数位
//#include<stdio.h>
//void Func(int n)
//{
//	int i = 0;
//	//先打印奇数位
//	for (i = 30; i >=0 ; i-=2)
//	{
//		printf("%d ", 1 & (n>>i));
//	}
//	printf("\n");
//	//后打印偶数位
//	for (i = 31; i >=1; i-=2)
//	{
//		printf("%d ", 1 & (n >> i));
//	}
//}
//
//int main()
//{
//	int n = 0;
//	scanf("%d", &n);
//	Func(n);
//	return 0;
//}



#include<stdio.h>
int main()
{
	int n = 0;
	int m = 0;
	scanf("%d %d", &n, &m);
	int tmp = n ^ m;
	int count = 0;
	while (tmp)
	{
		count++;
		tmp &= (tmp - 1);
	}
	printf("%d\n", count);
	return 0;
}